package biblio.dao;

import static biblio.dao.UtilsDao.toSQLDate;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import biblio.metier.EnumStatusExemplaire;
import biblio.metier.Exemplaire;

public class ExemplairesDao extends AbstractDao<Exemplaire> {

	private final String SQL_FIND = "SELECT * FROM exemplaire WHERE idExemplaire = ?";
	private final String SQL_CREATE = "INSERT INTO exemplaire VALUES (SEQ_EXEMPLAIRE.nextval, ?, ?, ?)";
	private final String SQL_UPDATE = "UPDATE exemplaire "
			+ "SET dateAchat= ?,  status = ?, isbn = ?"
			+ "WHERE idExemplaire = ?";

	public ExemplairesDao() throws ClassNotFoundException {
		super();
	}

	// TODO Change exception handling
	@Override
	public void create(Exemplaire exemplaire) {
		Connection connection;
		PreparedStatement pStatement;

		try {
			connection = connFactory.getConnection();

			pStatement = connection.prepareStatement(SQL_CREATE);

			Date date = toSQLDate(exemplaire.getDateAchat());
			String status = exemplaire.getStatus().toString();
			String isbn = exemplaire.getIsbn();

			pStatement.setDate(1, date);
			pStatement.setString(2, status);
			pStatement.setString(3, isbn);

			int rowsCreated = pStatement.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// TODO Manage case no exemplaire is found
	// TODO Change exception handling
	@Override
	public Exemplaire find(int id) {
		Connection connection;
		Exemplaire exemplaire = new Exemplaire();
		PreparedStatement pStatement;
		ResultSet rs;

		try {
			connection = connFactory.getConnection();

			pStatement = connection.prepareStatement(SQL_FIND);
			pStatement.setInt(1, id);

			rs = pStatement.executeQuery();

			rs.next();

			String isbn = rs.getString("isbn");
			Date date = rs.getDate("dateAchat");
			String status = rs.getString("status");

			exemplaire.setIdExemplaire(id);
			exemplaire.setIsbn(isbn);
			exemplaire.setDateAchat(date);
			exemplaire.setStatus(EnumStatusExemplaire.valueOf(status));
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return exemplaire;
	}

	@Override
	public void update(Exemplaire exemplaire) {
		Connection connection;
		PreparedStatement pStatement;

		try {
			connection = connFactory.getConnection();

			pStatement = connection.prepareStatement(SQL_UPDATE);

			Date date = toSQLDate(exemplaire.getDateAchat());
			String status = exemplaire.getStatus().toString();
			String isbn = exemplaire.getIsbn();
			int id = exemplaire.getIdExemplaire();

			pStatement.setDate(1, date);
			pStatement.setString(2, status);
			pStatement.setString(3, isbn);
			pStatement.setInt(4, id);

			int rowsUpdated = pStatement.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void delete(int id) {
		// TODO Auto-generated method stub
	}
}